import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

# 设置中文字体和解决负号显示问题
plt.rcParams['font.sans-serif'] = ['Songti SC']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 14
# 读取CSV文件中的年龄数据
df = pd.read_csv('./data/ages_distribution.csv')


# 新增一列 '年龄段' 用于分类
def age_group(age):
    if 18 <= age <= 35:
        return '青年 (18-35岁)'
    elif 36 <= age <= 59:
        return '中年 (36-59岁)'
    else:
        return '老年 (≥60岁)'


df['年龄段'] = df['年龄'].apply(age_group)
# 使用 seaborn 绘制小提琴图（兼容新版本）
plt.figure(figsize=(8, 6))
sns.violinplot(
    x="年龄段",  # 虚拟X轴，让多个小提琴图并列显示
    y='年龄',
    hue='年龄段',
    data=df,
    palette="Set2",
    inner="quartile",
    legend=False
)
# 手动设置横轴标签
plt.xticks(ticks=[0, 1, 2], labels=['中年\n(36-59岁)',
                                    '老年\n(≥60岁)',
                                    '青年\n(18-35岁)', ],
           fontsize=10)
# 添加标题和坐标轴标签
plt.title('不同年龄段居民年龄分布的小提琴图')
plt.ylabel('年龄')
plt.xlabel('人群分类', labelpad=10)
# 显示网格
plt.grid(True, axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
# 保存图片
plt.savefig('./Figures/violinplot09-6-seaborn.png', dpi=300)
plt.show()
